﻿using System;
using System.ComponentModel;
using OpenQuant.Quik.Design;
using System.Xml.Serialization;
using System.IO;

namespace OpenQuant.Quik
{
    [Serializable]    
    [TypeConverter(typeof(ExpandableObjectConverter))]
    public class Settings
    {
        [TypeConverter(typeof(AccountConvertor))]
        [Category("Execution"), Description("Текущий торговый счет")]
        public string Account { get; set; }
        [Category("Execution"), Description("Процентное отклонение от цены последней сделки в худшую сторону для имитации рыночного приказа из лимитированного")]
        public double MarketOrderFactor { get; set; }
        [ReadOnly(true)]
        [Category("Execution"), Description("Идентификатор последней отправленной заявки")]
        public long TransactionId { get; set; }
        [Category("Import"), Description("Полный путь к Quik")]
        [TypeConverter(typeof(QuikPathConvertor))]
        public string FullPath { get; set; }
        [Description("Следует ли экспортировать Стаканы по инструментам")]
        public bool EnableOrderBookExport { get; set; }

        /// <summary>
        /// Конструктор класса
        /// </summary>
        public Settings()
        {
            TransactionId = 1;
        }

        /// <summary>
        /// Создать экземпляр класса, десериализованный из файла. При ошибке используется конструктор по умолчанию
        /// </summary>
        /// <param name="fullPath">Полный путь к файлу</param>
        /// <returns></returns>
        public static Settings Load(string fullPath)
        {
            if (string.IsNullOrWhiteSpace(fullPath)) throw new ArgumentException("Не задан путь к файлу настроек провайдера");
            if (!File.Exists(fullPath)) throw new FileNotFoundException("Файл с настройками не найден");

            Settings rst;
            var serializer = new XmlSerializer(typeof(Settings));
            using (var stream = new StreamReader(fullPath))
                rst = (Settings)serializer.Deserialize(stream.BaseStream);
            return rst;
        }

        /// <summary>
        /// Сериализовать экземпляр настроек в файл
        /// </summary>
        /// <param name="settings">Экземпляр настроек</param>
        /// <param name="fullPath">Полный путь к файлу</param>
        public static void Save(Settings settings, string fullPath)
        {
            if (settings == null) throw new ArgumentNullException("settings");
            if (string.IsNullOrWhiteSpace(fullPath)) throw new ArgumentException("Не задан путь к файлу настроек провайдера");

            var serializer = new XmlSerializer(typeof(Settings));
            using (var stream = new StreamWriter(fullPath))
                serializer.Serialize(stream.BaseStream, settings);
        }

        public override string ToString()
        {
            return string.Format("Account={0}", Account);
        }
    }
}